package com.qianxx.base;

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
import com.qianxx.draw.R;
import com.qianxx.base.loading.LoadingControl;
import com.qianxx.base.request.Config;
import com.qianxx.base.request.Error;
import com.qianxx.base.request.RM;
import com.qianxx.base.request.RequestBean;
import com.qianxx.base.request.RequestCallback;
import com.qianxx.base.request.RequestUtil;
import com.qianxx.base.uploadFile.FormFile;
import com.qianxx.base.uploadFile.HttpRequester;
import com.qianxx.base.utils.LogUtil;
import com.qianxx.base.utils.ToastUtil;
import com.umeng.analytics.MobclickAgent;
import java.util.HashMap;
import java.util.Map;

import cn.jpush.android.api.JPushInterface;

/**
 * @author you.y
 */
public class BaseActivity extends FragmentActivity implements RequestCallback,
        OnClickListener {

    public TextView tvTitle; // Title
    public ImageView imgTopLeft; // 右上角按键
    protected TextView tvTopRight; // 左上角按键
    public ImageView imgTopRight; // 右上角图片按键
    protected RequestQueue mRequest; // 请求队列对象
    protected LoadingControl mControl; // 用于控制loading指示
    public View layEmpty; // 数据为空时显示
    private boolean ifPressed; // 为避免快速点击
    private View rightLayout;

    // private int intervalTime = 400; // 允许按键相应的最端间隔时间

    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        AppManager.getAppManager().addActivity(this);
        // 为Toast工具类 设置上下文
        ToastUtil.init(this);
    }

    @Override
    protected void onResume() {
        JPushInterface.onResume(this);
        super.onResume();
        MobclickAgent.onResume(this);
    }

    @Override
    protected void onPause() {
        JPushInterface.onPause(this);
        super.onPause();
        MobclickAgent.onPause(this);
    }

    /**
     * 获取根layout
     */
    protected View getRootView() {
        View root = null;
        try {
            root = ((ViewGroup) findViewById(android.R.id.content))
                    .getChildAt(0);
        } catch (Exception e) {
            LogUtil.e("BaseAty --- 寻找根layout出错！");
        }
        return root;
    }

    /**
     * 查找"loading指示"控件
     */
    protected void findLoading() {
        if (mControl == null) {
            mControl = new LoadingControl(this);
        }
    }

    /**
     * 显示"loading指示"
     */
    public void showLoading() {
        showLoading(false);
    }

    /**
     * 显示"loading指示"
     * <p/>
     * isFullScreen = true，表示title部分也不可点击。
     */
    public void showLoading(boolean isFullScreen) {
        findLoading();
        // 默认title部分可以点击
        mControl.showLoading(new Config().setIsFullScreen(isFullScreen));
    }

    /**
     * 隐藏"loading指示"
     */
    public void hideLoading() {
        if (mControl != null) {
            mControl.hideLoading();
        }
    }

    /**
     * 设置右上角按键中的文字；
     * <p/>
     * 传入字符串资源的id
     */
    protected void showTopRight(int strId) {
        String str = getResources().getString(strId);
        showTopRight(str);
    }

    /**
     * 设置右上角按键中的文字
     */
    protected void showTopRight(String str) {
        if (tvTopRight == null) {
            tvTopRight = (TextView) findViewById(R.id.tvTopRight);
        }
        tvTopRight.setText(str);
        tvTopRight.setVisibility(View.VISIBLE);
    }

    /**
     * 隐藏右边的按钮
     */
    protected void hideTopRightLayout() {
        View rightLayout = findViewById(R.id.rightLayout);
        rightLayout.setVisibility(View.GONE);
    }

    /**
     * 隐藏左边的按钮
     */
    protected void hideTopLeftLayout() {
        View leftLayout = findViewById(R.id.imgTopLeft);
        leftLayout.setVisibility(View.GONE);
    }


    /**
     * 设置右上角按键中的文字
     */
    protected void showTopRightImg(int resId) {
        if (imgTopRight == null) {
            imgTopRight = (ImageView) findViewById(R.id.imgTopRight);
        }
        imgTopRight.setImageResource(resId);
        imgTopRight.setVisibility(View.VISIBLE);
    }

    /**
     * 设置右上角按键中的文字，并选中颜色
     * <p/>
     * isSelected=true显示蓝色，false显示灰色
     */
    protected void showTopRight(int strId, boolean isSelected) {
        selectTopRight(isSelected);
        showTopRight(strId);
    }

    /**
     * 隐藏右上角按键中的文字
     */
    protected void hideTopRight() {
        if (tvTopRight != null && tvTopRight.getVisibility() == View.VISIBLE) {
            tvTopRight.setVisibility(View.INVISIBLE);
        }
    }

    /**
     * 设置Title；
     * <p/>
     * 传入字符串资源的id
     */
    protected void showTitle(int strId) {
        String str = getResources().getString(strId);
        showTitle(str);
    }

    /**
     * 设置Title
     */
    protected void showTitle(String str) {
        if (tvTitle == null) {
            tvTitle = (TextView) findViewById(R.id.tvTitle);
        }
        tvTitle.setText(str);
    }

    /**
     * 改变左上角按键的图片
     * <p/>
     * isSelected=true在首页使用
     */
    protected void selectTopLeft(boolean isSelected) {
        if (imgTopLeft == null) {
            imgTopLeft = (ImageView) findViewById(R.id.imgTopLeft);
        }
        imgTopLeft.setSelected(isSelected);
    }

    /**
     * 改变右上角按键的颜色
     * <p/>
     * isSelected=true时，文字显示蓝色
     */
    protected void selectTopRight(boolean isSelected) {
        if (tvTopRight == null) {
            tvTopRight = (TextView) findViewById(R.id.tvTopRight);
        }
        if (isSelected) {
            tvTopRight.setTextColor(getResources().getColor(R.color.sel_dark));
        } else {
            tvTopRight.setTextColor(getResources().getColor(R.color.sel_dark));
        }
    }

    /**
     * 左上角按键，点击触发
     */
    public void topLeftClick(View v) {
        finish();
    }

    /**
     * 右上角按键，点击触发
     */
    public void topRightClick(View v) {

    }

    /**
     * @param requestTag -请求标签（用于区分不同请求）
     * @param url        -配置的api接口
     * @param method     -请求方法（目前仅支持GET，POST）
     * @param bean       -返回的数据类型
     * @param params     -参数信息
     */
    protected void requestData(String requestTag, String url, RM method,
                               Class<? extends RequestBean> bean, HashMap<String, String> params) {
        showLoading(); // 显示Loading指示，默认title部分可以点击
        if (mRequest == null) {
            mRequest = Volley.newRequestQueue(this);
        }
        RequestUtil.requestData(mRequest, requestTag, url, method, bean,
                params, this);
    }

    /**
     * @param requestTag       -请求标签（用于区分不同请求）
     * @param url              -配置的api接口
     * @param method           -请求方法（目前仅支持GET，POST）
     * @param bean             -返回的数据类型
     * @param params           -参数信息
     * @param isTopUnclickable -为true时，title部分不可点击；为false时，title部分的按键可以点击(比如返回键)
     */
    protected void requestData(String requestTag, String url, RM method,
                               Class<? extends RequestBean> bean, HashMap<String, String> params,
                               boolean isTopUnclickable) {
        showLoading(isTopUnclickable); // 显示Loading指示，默认title部分可以点击
        if (mRequest == null) {
            mRequest = Volley.newRequestQueue(this);
        }
        RequestUtil.requestData(mRequest, requestTag, url, method, bean,
                params, this);
    }

    /**
     * 用于取消相应请求（并非真正取消请求，而是调用该方法后，标签为requestTag的请求不触发Volley回调）
     *
     * @param requestTag -请求标签
     */
    protected void cancelRequest(String requestTag) {
        if (mRequest == null) {
            mRequest = Volley.newRequestQueue(this);
        }
        mRequest.cancelAll(requestTag);
        // TODO
        // 如果取消后，RequestQueue中没有其他请求，需要关闭"loading指示"
    }

    /**
     * 不带loading指示的数据请求
     */
    protected void requestDataWithoutLoading(String requestTag, String url,
                                             RM method, Class<? extends RequestBean> bean,
                                             HashMap<String, String> params) {
        if (mRequest == null) {
            mRequest = Volley.newRequestQueue(this);
        }
        RequestUtil.requestData(mRequest, requestTag, url, method, bean,
                params, this, new Config().setShowLoading(false));
    }

    @Override
    public void requestSuccess(RequestBean baseBean, Config config) {
        hideLoading(config); // 控制loading指示

    }

    @Override
    public void requestFail(RequestBean baseBean, Config config) {
        hideLoading(config); // 控制loading指示
        dealWithFailResult(baseBean, config); // 处理结果
    }

    // 返回true, 表示baseBean为空
    protected boolean dealWithFailResult(RequestBean baseBean, Config config) {
        // 该方法中的bean有可能为空
        if (baseBean == null) {
            ToastUtil.getInstance().toast(Error.NetError);
            return true;
        }

        // isShowToast = true 才弹出提示
        if (config.isShowToast()) {
            String msg = baseBean.getMessage();
            if (TextUtils.isEmpty(msg)) {
                msg = Error.NetError; // TODO 提示语需要根据errCode相应变更
            }
            ToastUtil.getInstance().toast(msg);
        }
        return false;
    }

    /**
     * 说明：如果token失效，requestTokenInvalid 和 requestFail 都会执行；
     * <p/>
     * 并且 requestTokenInvalid 在 requestFail之前调用。
     */
    @Override
    public void requestTokenInvalid(String requestTag, Config config) {
        // hideLoading(config); // 控制loading指示
        // ToastUtil.getInstance().toast(Error.TokenInvalid);

        // 为保证token失效，必然弹出toast添加
        if (!config.isShowToast()) {
            toast(Error.TokenInvalidString);
        }
    }

    /**
     * 根据Config中showLoading来判断是否隐藏Loading指示
     * <p/>
     * 说明：对于不带loading指示的请求，其返回结果是不应隐藏loading指示（此时的loading指示可能是其它请求触发的）
     */
    protected void hideLoading(Config config) {
        if (config.isShowLoading()) {
            hideLoading();
        }
    }

    /**
     * 设置layEmpty的显示
     */
    protected void showEmpty(int strId) {
        String str = getResources().getString(strId);
        showEmpty(str);
    }

    protected void showEmpty(String str) {
        if (layEmpty == null) {
            layEmpty = findViewById(R.id.layEmpty);
        }
        TextView tvEmpty = (TextView) findViewById(R.id.tvEmpty);
        tvEmpty.setText(str);
        layEmpty.setVisibility(View.VISIBLE);
    }

    protected void showEmpty(int drawableId, int strId) {
        String str = getResources().getString(strId);
        showEmpty(drawableId, str);
    }

    protected void showEmpty(int drawableId, String str) {
        ImageView imgEmpty = (ImageView) findViewById(R.id.imgEmpty);
        imgEmpty.setImageResource(drawableId);
        showEmpty(str);
    }

    /**
     * 设置数据为空时 的 页面
     */
    protected void setEmpty(View layEmpty) {
        this.layEmpty = layEmpty;
    }

    /**
     * 设置数据为空时的提示语
     */
    protected void setEmptyText(int strId) {
        String emptyText = getString(strId);
        setEmptyText(emptyText);
    }

    /**
     * 设置数据为空时的提示语
     */
    protected void setEmptyText(String emptyText) {
        if (findEmpty()) {
            View tvEmpty = layEmpty.findViewById(R.id.tvEmpty);
            if (tvEmpty != null) {
                ((TextView) tvEmpty).setText(emptyText);
            } else {
                LogUtil.w("BaseAty --- 没有找到tvEmpty！");
            }
        }
    }

    protected void showEmpty() {
        if (findEmpty()) {
            layEmpty.setVisibility(View.VISIBLE);
        }
    }

    protected void hideEmpty() {
        if (findEmpty()) {
            layEmpty.setVisibility(View.GONE);
        }
    }

    protected boolean findEmpty() {
        if (layEmpty == null) {
            layEmpty = findViewById(R.id.layEmpty);
        }
        // 布局中不一定有layEmpty
        if (layEmpty != null) {
            return true;
        } else {
            LogUtil.w("BaseAty --- 没有找到layEmpty！");
            return false;
        }
    }

    // 获取layEmpty
    protected View getEmpty() {
        if (layEmpty == null) {
            layEmpty = findViewById(R.id.layEmpty);
        }
        // 布局中不一定有layEmpty
        if (layEmpty != null) {
            return layEmpty;
        } else {
            LogUtil.w("BaseAty --- 没有找到layEmpty！");
            return null;
        }
    }

    /**
     * 为避免快速点击添加。
     * <p/>
     * 一般在onClick方法中使用，只有当返回false时，才执行按键点击操作。
     */
    protected boolean ifPressed() {
        // 已点击，返回true
        if (ifPressed) {
            return true;
        }
        // 设置为已点击，400ms后，可重新点击
        ifPressed = true;
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                ifPressed = false;
            }
        }, 400); // 400ms 为允许按键相应的最端间隔时间
        return false;
    }

    protected void toast(int strId) {
        toast(getString(strId));
    }

    protected void toast(String str) {
        ToastUtil.getInstance().toast(str);
    }

    @Override
    public void onClick(View v) {

    }

    private long exitTime = 0;

    protected boolean onKeyDownExit(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK
                && event.getAction() == KeyEvent.ACTION_DOWN) {
            if ((System.currentTimeMillis() - exitTime) > 2000) {
                Toast.makeText(getApplicationContext(),
                        R.string.press_again_exit, Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            } else {
                finish();
            }
            return true;
        }
        return false;
    }

    public void uploadFiles(String uploadURL, Map<String, String> params,
                            FormFile[] files, HttpRequester.OnRequestListener listener) {
        HttpRequester instanse = HttpRequester.getInstanse(this);
        instanse.startUpload(uploadURL, params, files, listener);
    }
}
